﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DDD.Core {
    /// <summary>
    /// プロパティをエクスポート可能にするインターフェース
    /// </summary>
    /// <remarks>
    /// このインターフェイスは､インターフェイスを実装した構造体がエクスポート可能である事を示唆します｡
    /// プロパティは上記7つの数値型か､もしくはその7つの数値型をパラメーターにもつ
    ///  <see cref="IExportable{T}"/> インターフェースを実装した構造体の場合のみ(シェーダーに)エクスポート可能です｡
    ///  エクスポートの詳細については､<see cref="ShaderProgram"/> を参照してください｡ 
    ///  このインターフェースは構造体のコンポーネントに統一された方法でアクセスする能力を提供します｡ 
    /// </remarks>
    /// <typeparam name="T">組み込みの数値型の <c>byte, sbyte, short, ushrot, int, uint, float</c> のいずれか｡ </typeparam>
    public interface IExportable<out T> {

        /// <summary>
        /// コンポーネント数
        /// </summary>
        /// <remarks>
        /// この構造体の要素数を返します｡
        /// </remarks>
        int ComponentCount { get; }

        /// <summary>
        /// コンポーネント要素にアクセスするインデクサー
        /// </summary>
        /// <remarks>
        /// <paramref name="index"/> 番目の要素を取得します｡
        /// </remarks>
        /// <param name="index">取得する要素のインデックス</param>
        /// <exception cref="IndexOutOfRangeException">
        /// <c><paramref name="index"/> &lt; 0 || <typeparamref name="index"/> &gt;= <see cref="ComponentCount"/></c>
        /// </exception>
        /// <returns><typeparamref name="index"/> 番目の要素の値</returns>
        T this[int index] { get; }
        
    }
}
